"""
文件操作工具
"""
import os
import hashlib
from tests.utils.logUtil import log


def prepare_files(params: dict) -> list:
    """
    处理文件上传部分
    :param params: 文件相关信息
    :return: 文件列表
    """
    files = []

    # 处理头像、封面图
    for field in ['avatarPath', 'coverPath']:
        if field in params and os.path.isfile(params[field]) and os.path.getsize(params[field]) > 0:
            # 去掉字段名中的 "Path"
            field_name = field.replace("Path", "")
            files.append((field_name, (os.path.basename(params[field]), open(params[field], 'rb'))))

    return files



def get_file_info(params, field_name):
    """
    将 params 中的文件路径字段替换为文件对象，并添加文件大小和 MD5 值。
    由调用者负责关闭文件对象。
    :param params: 包含文件路径的参数字典
    :param field_name: 指定文件路径的字段名
    :return: 包含文件对象及相关信息的字典
    """
    # 获取文件路径
    file_path = params.get(field_name)

    if not file_path or not os.path.isfile(file_path):
        raise ValueError(f"无效的文件路径: {file_path}")

    # 计算文件大小和 MD5 值
    hash_md5 = hashlib.md5()
    file_size = 0
    with open(file_path, "rb") as f:
        for chunk in iter(lambda: f.read(4096), b""):
            hash_md5.update(chunk)
            file_size += len(chunk)

    file_sign = hash_md5.hexdigest()

    # 返回文件对象并让调用者负责关闭文件
    file_obj = open(file_path, "rb")  # 手动打开文件并返回

    return {
        field_name: (file_obj, "application/octet-stream", os.path.basename(file_path)),  # 文件对象及信息
        "fileSize": file_size,  # 文件大小
        "fileSign": file_sign,  # MD5 值
    }



def get_file_info1(file_path: str) -> list:
        """
        处理单个文件上传部分，并返回文件的 MD5 签名和文件大小
        :param file_path: 文件路径
        :return: 文件列表，每个元素包含字段名、文件名、文件对象、MD5 签名和文件大小
        """
        files = []

        if os.path.isfile(file_path) and os.path.getsize(file_path) > 0:
            # 提取文件名
            file_name = os.path.basename(file_path)

            # 计算文件的 MD5 签名和文件大小
            hash_md5 = hashlib.md5()
            file_size = 0

            with open(file_path, "rb") as f:
                for chunk in iter(lambda: f.read(4096), b""):
                    hash_md5.update(chunk)
                    file_size += len(chunk)

            file_sign = hash_md5.hexdigest()

            # 打开文件并以二进制读取模式 ('rb') 读取文件内容
            with open(file_path, "rb") as f:
                files.append(('file', (file_name, f, file_sign, file_size)))

        return files

def calculate_md5(file_path: str) -> str:
    """
    计算文件的 MD5 签名
    :param file_path: 文件路径
    :return: 文件的 MD5 签名
    """
    hash_md5 = hashlib.md5()
    with open(file_path, "rb") as f:
        for chunk in iter(lambda: f.read(4096), b""):
            hash_md5.update(chunk)
    return hash_md5.hexdigest()


def close_files(files: list):
    """
    关闭上传的文件
    :param files: 文件资源列表
    :return: 无
    """
    if files:
        for _, file_obj in files:
            file_obj[1].close()


def close_file(files: dict):
    """
    关闭上传的文件
    :param files: 文件资源字典
    :return: 无
    """
    if files:
        for file_obj in files.values():
            if hasattr(file_obj, 'close') and callable(file_obj.close):
                file_obj.close()

